package com.wangyf.thread.c_015_cyclicbarrier;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;

/**
 * CyclicBarrier是一个同步的辅助类，允许一组线程相互之间等待，达到一个共同点，再继续执行。
 * 测试同步工具类CyclicBarrier
 * 可以循环使用，下面是每满20人 释放所有被阻塞的线程，
 * 甚至如果人数不满 会阻塞main线程不能关闭
 * 参考: https://blog.csdn.net/tolcf/article/details/50925145
 * @author wangyf
 * @date 2021/1/4 18:55
 * 使用场景：
 */
public class T {
    public static void main(String[] args) throws InterruptedException {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(20, () -> System.out.println("人满。。发车。。"));
        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }
        TimeUnit.SECONDS.sleep(1);
        System.out.println("main end");
    }
}
